package strategy;

import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import jugadores.Jugador;
import jugadores.Posicion;
import jugadores.Titular;
import equipos.Equipo;
import equipos.Formacion;

public class FormacionStrategyImpl implements FormacionStrategy {
    /* VARIABLES DE INSTANCIA */
    private List<Posicion> posiciones;

    // private Formacion form;

    /* CONSTRUCTOR */

    public FormacionStrategyImpl(final List<Posicion> pos) {
        this.posiciones = pos;
    }

    public FormacionStrategyImpl() {
        // Todas las formaciones van a ser iguales :(
        this.posiciones = new Vector<Posicion>();

        for (Posicion p : Posicion.values()) {
            this.posiciones.add(p);
        }

        this.posiciones.add(Posicion.DELANTERO);
        this.posiciones.add(Posicion.CENTRAL);
        this.posiciones.add(Posicion.CENTRAL);
    }

    /* METODOS */
    public Formacion armarFormacion(final Equipo equipo) {
        Formacion formacion = new Formacion(equipo);
        Jugador j;

        Set<Jugador> removidos = new HashSet<Jugador>();

        for (Posicion p : this.posiciones) {
            j = equipo.mejorJugador(p);
            removidos.add(j);
            equipo.removerJugador(j);
            formacion.agregarTitular(new Titular(j, p));
        }
        formacion.agregarSuplentes(equipo.getJugadores());

        // Se retornan los jugadores que fueron removidos del equipo durante la iteracion
        removidos.addAll(equipo.getJugadores());
        equipo.setJugadores(removidos);

        return formacion;
    }
}
